package fr.peltier.nicolas.robot.ai.organes.actionneurs;

import java.io.File;

import org.apache.log4j.Logger;

import net.engio.mbassy.bus.MBassador;
import net.engio.mbassy.listener.Handler;
import fr.peltier.nicolas.robot.ai.Robot;
import fr.peltier.nicolas.robot.ai.organes.AbstractOrgane;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.ParoleEvent;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.ReconnaissanceVocaleControleEvent;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.ReconnaissanceVocaleControleEvent.CONTROLE;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.RobotEvent;
import fr.peltier.nicolas.si.vox.son.LecteurTexte;
import fr.peltier.nicolas.si.vox.util.ConfigurationSyntheseVocale;

/**
 * Organe de la parole permettant la synthèse vocale.
 * @author Nicolas Peltier (nico.peltier@gmail.com)
 */
public class OrganeParole extends AbstractOrgane {

    /** Lecteur de texte. */
    private LecteurTexte lecteurTexte;
    
    /** Logger. */
    private Logger logger = Logger.getLogger(OrganeParole.class);

    /** Constructeur. */
    public OrganeParole(MBassador<RobotEvent> systemeNerveux) {
        super(systemeNerveux);
        // Initialisation du lecteur
        ConfigurationSyntheseVocale.getInstance().setDossierRacine(System.getProperty("robot.dir") + File.separator + "synthese-vocale");
        lecteurTexte = new LecteurTexte();
    }

    /**
     * Lit un texte.
     * @param texte le texte à dire
     */
    public void lire(String texte) {
        if(texte != null && !texte.isEmpty()) {
            // Envoi d'un évènement pour mettre en pause la reconnaissance vocale
            final ReconnaissanceVocaleControleEvent eventPause = new ReconnaissanceVocaleControleEvent();
            eventPause.setControle(CONTROLE.METTRE_EN_PAUSE);
            systemeNerveux.publish(eventPause);

            logger.debug("Lecture :\t" + texte);
            // Lecture du texte
            lecteurTexte.setTexte(texte);
            lecteurTexte.playAll();

            logger.debug("Fin lecture :\t" + texte);

            // Envoi d'un évènement pour redémarrer la reconnaissance vocale
            final ReconnaissanceVocaleControleEvent eventRedemarrage = new ReconnaissanceVocaleControleEvent();
            eventRedemarrage.setControle(CONTROLE.DEMARRER);
            systemeNerveux.publish(eventRedemarrage);
        }
    }
    
    /**
     * Intercepte les évènements pour lire du texte.
     * @param paroleEvent évènement pour lire du texte
     */
    @Handler
    public void handleParoleEvent(ParoleEvent paroleEvent) {
        if (paroleEvent.getTexte() != null && !paroleEvent.getTexte().trim().equals("")) {
            lire(paroleEvent.getTexte().trim());
        }
    }

    @Override
    public void initialiser() {
        
    }

    @Override
    public void arreter() {
        
    }
    
    public static void main(String[] args) {
     // Initialisation du lecteur
        ConfigurationSyntheseVocale.getInstance().setDossierRacine("/home/npeltier/Robot/Programme" + File.separator + "synthese-vocale");
        LecteurTexte lecteurTexte = new LecteurTexte();
        lecteurTexte.setTexte("17 ?");
        lecteurTexte.playAll();
    }

}
